﻿#include "MainWindow.h"
#include <QSoundEffect>
#include <QPushButton>
#include <QMediaMetaData>
#include <QDir>
#include <QUrl>






Mainwindow::Mainwindow(QWidget* parent)
	:QWidget(parent)
	,ui(new Ui::MainWindow)
	,m_mediaplayer(new QMediaPlayer(this))
	,m_audioOutput(new QAudioOutput(this))
	,m_volumeSlider(new QSlider(this))
	,m_videowidget(new QVideoWidget)
	//,m_define_label(new QLabel("66666"))
{
	ui->setupUi(this);

	loadMedia("assets/music");

	init();
}

Mainwindow::~Mainwindow()
{
	delete ui;
}

void Mainwindow::loadMedia(const QString& path)
{
	QDir dir(path);

	auto list = dir.entryList(QStringList() << "*.mp3" << "*.mp4"<<"*.ncm");
	if (list.isEmpty())
	{
		qWarning() << "media not found~~~~";
		return;

	}

	for (auto str : list)
	{
		qInfo() << str;
		//把前缀加上：	用来播放
		qInfo() << QUrl::fromLocalFile(path + "/" + str);


		//把媒体文件路径保存到播放列表：
#if playlist
		m_playList.append(QUrl::fromLocalFile(path + "/" + str));
#else
		m_playList_song.addUrl(QUrl::fromLocalFile(path + "/" + str));

#endif
	}

	//显示到ListWidget上：
	ui->SongList->addItems(list);

}

//切换音乐和视频：
void Mainwindow::Switch_between_music_and_video()
{
	//查看当前的音频：
	auto url = m_playList_song.currentUrl();
	//音频格式是mp4 还是mp3：
	if (url.fileName().contains(".mp4"))
	{
		//创建一个窗口：
		//m_videowidget->show();
		//m_define_label->hide();
	}
	else
	{
		//m_videowidget->hide();
		//m_define_label->show();
	}



	m_mediaplayer->setSource(url);
	m_mediaplayer->play();
}
//初始化：
void Mainwindow::init()
{
	//1.设置ListWidget的默认项：
#if playlist
	ui->SongList->setCurrentRow(m_currentIndex());
#else
	ui->SongList->setCurrentRow(m_playList_song.currentIndex());

#endif



	//2.设置在ListWidget中点击就播放歌曲：
	connect(ui->SongList, &QListWidget::currentRowChanged, [=](int row)
		{
			//把当前项行数给到Url列表中，这段一定要有，不然肯定有错误：
			m_playList_song.setCurrentIndex(row);

			//重新设置播放源：
			Switch_between_music_and_video();

		});


	m_mediaplayer->setAudioOutput(m_audioOutput);
	//m_mediaplayer->setPlaybackRate(QMediaPlayer::PlaybackState::StoppedState);
	//设置音量：
	m_audioOutput->setVolume(1);



	//3.连接信号槽，设置TimeLabel的播放时长和总时长：
	connect(m_mediaplayer, &QMediaPlayer::positionChanged, this, &Mainwindow::onPositionChanged);
	connect(m_mediaplayer, &QMediaPlayer::durationChanged, this, &Mainwindow::onDurationChanged);



	//4.设置音量滑块：
	//设置滑块的风格：
	m_volumeSlider->setWindowFlag(Qt::FramelessWindowHint);	//设置滑块的状态栏消失
	m_volumeSlider->setWindowFlag(Qt::ToolTip);				//设置滑块的风格为工具提示；
	//设置滑块大小：
	m_volumeSlider->setFixedSize(20, 150);
	//设置滑块范围：
	m_volumeSlider->setRange(0, 1000);
	connect(m_volumeSlider, &QSlider::sliderMoved, this, [=](int value)
		{
			//设置播放器音量：
			m_audioOutput->setVolume(static_cast<float>(value) / m_volumeSlider->maximum());
		


			//看看设置音量 滑动滑块的时候到底是谁获取了叫焦点：
			qInfo() << this->focusWidget()->objectName();		//"VolumeBtn"
			//所以焦点一直在音量按钮上，即使在滑动滑块，焦点也并不在滑块上！！！！
		
		});
	//更新滑块数据：
	m_volumeSlider->setValue(m_audioOutput->volume() * m_volumeSlider->maximum());



			//有bug，不能给ui文件中的widget添加控件；
	//5.给videowidget 添加 m_videowidget 和 m_define_label:
	//ui->videowidget->layout()->addWidget(m_videowidget);
	//m_mediaplayer->setVideoOutput(m_videowidget);

	//ui->videowidget->layout()->addWidget(m_define_label);



	//6.设置歌曲播放进度条：
	connect(ui->durationSlider, &QSlider::sliderMoved, [=](int pos)
		{
			m_mediaplayer->setPosition(pos);
		});




}



//槽函数		这些槽函数和ui文件中的控件名相同，所以不用对应信号与槽，注意与ui文件的名字相同就行；
//播放按键函数：
void Mainwindow::on_PlayBtn_released()
{
	qInfo() << __FUNCSIG__;
	qInfo() << "player state:>" << m_mediaplayer->playbackRate();

	//判断当前的播放状态：
	auto state = m_mediaplayer->playbackState();

	if (state == QMediaPlayer::PlaybackState::StoppedState)			//停止状态
	{
		//重新设置播放源：
		Switch_between_music_and_video();
		//提示下一个状态：
		ui->PlayBtn->setText("暂停");
	}
	else if (state == QMediaPlayer::PlaybackState::PausedState)		//暂停状态
	{
		m_mediaplayer->play();
		//提示下一个状态：
		ui->PlayBtn->setText("暂停");
	}
	else if (state == QMediaPlayer::PlaybackState::PlayingState)	//播放状态
	{
		m_mediaplayer->pause();
		ui->PlayBtn->setText("播放");
	}
}

//上一首按键函数：
void Mainwindow::on_PreviousBtn_released()
{
	qInfo() << __FUNCSIG__;

	//设置焦点：
	this->setFocus();

	//设置列表当前选中项：
#if playlist
	if (--m_currentIndex < 0)
	{
		m_currentIndex = m_playList.size() - 1;
	}
	ui->SongList->setCurrentRow(m_currentIndex);
#else
	m_playList_song.prevSong();
	m_mediaplayer->setSource(m_playList_song.currentUrl());
	ui->SongList->setCurrentRow(m_playList_song.currentIndex());
#endif

}

//下一首按键函数：
void Mainwindow::on_NextBtn_released()
{
	qInfo() << __FUNCSIG__;

	//设置焦点：
	this->setFocus();

		//设置列表当前选中项：
#if playlist 
	if (++m_currentIndex > m_playList.size() - 1)
	{
		m_currentIndex = 0;
	}
	ui->SongList->setCurrentRow(m_currentIndex);
#else
	m_playList_song.nextSong();
	m_mediaplayer->setSource(m_playList_song.currentUrl());
	ui->SongList->setCurrentRow(m_playList_song.currentIndex());

#endif

}

//音量调节按键函数：
void Mainwindow::on_VolumeBtn_released()
{
	qInfo() << __FUNCSIG__;
	
	//将VolumeBtn按钮的坐标
	auto pos = ui->VolumeBtn->mapTo(this,QPoint(0, 0));
	m_volumeSlider->move(pos - QPoint(-ui->VolumeBtn->x() - ui->VolumeBtn->width() - 30, -16 * ui->VolumeBtn->y())/*是一个偏移量，用于调整volumeSlider滑块的位置*/);
	qInfo() << pos;
	if (isDouble)
	{
		m_volumeSlider->show();
		isDouble = false;
	}
	else
	{
		m_volumeSlider->hide();
		isDouble = true;
	}
	
	m_volumeSlider->raise();	//堆叠到最上面来	显示到最前面


	//看看设置音量 滑动滑块的时候到底是谁获取了叫焦点：
	qInfo() << this->focusWidget()->objectName();		//"VolumeBtn"
	//所以焦点一直在音量按钮上，即使在滑动滑块，焦点也并不在滑块上！！！！
}

//槽函数；QMediaPlater的position（播放时长）变化的信号槽函数
void Mainwindow::onPositionChanged(qint64 position)
{
	qint64 duration = m_mediaplayer->duration();

	QString durationStr = QString("%1:%2").arg(duration / 1000 / 60 % 60, 
																	2, 10, QChar('0')				//重载函数，字符串宽度，进制，设置填充字符
	)
										  .arg(duration / 1000 % 60, 
																		   2, 10, QChar('0')		//重载函数，字符串宽度，进制，设置填充字符
										  );
	QString posStr = QString("%1:%2").arg(position / 1000 / 60 % 60,
																	2,10,QChar('0')					//重载函数，字符串宽度，进制，设置填充字符
	)
										  .arg(position / 1000 % 60,
																			  2, 10, QChar('0')		//重载函数，字符串宽度，进制，设置填充字符
										  );

	ui->TimeLabel->setText(posStr + "/" + durationStr);


	//设置position改变，durationSlider滑块实时改变值,来显示：
	ui->durationSlider->setValue(position);

}

//槽函数；获取QMediaPlater的音频的总时长来设置改变dutationSlider滑块的值：
void Mainwindow::onDurationChanged(quint64 duration)
{
	ui->durationSlider->setRange(0, duration);

}

//事件响应，鼠标点击按下，设置焦点：
void Mainwindow::mousePressEvent(QMouseEvent* event)
{
	//如果点击的部分不包含模块控件的矩形区域，就隐藏：
	if (!m_volumeSlider->rect().contains(event->pos()))
	{
		m_volumeSlider->hide();
	}

}

